home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / doom / quake.zip / PUNISHV1.ZIP / WEAPONS.QC < prev   
Text File  |  1996-08-18  |  43KB  |  1,845 lines

  1. /*
  2. ==========================================================
  3. Punish Weapons v1.01
  4. ==========================================================
  5. SplitMissile v1.02
  6. Tracer v1.01
  7. Nail Shotgun v0.6
  8. Auto Shotgun v1.01
  9. by Punisher  email: punisher@trojan.neta.com
  10. and Biafra
  11.  
  12. Bouncing Fragmentation Grenade!    7/28/96 by Steve Bond
  13. Email: wedge@nuc.net    WWW: http://www.nuc.net/quake
  14. improved by Punisher
  15. ==========================================================
  16. */
  17. void (entity targ, entity inflictor, entity attacker, float damage) T_Damage;
  18. void () player_run;
  19. void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage;
  20. void(vector org, vector vel, float damage) SpawnBlood;
  21. void() SuperDamageSound;
  22.  
  23.  
  24. // called by worldspawn
  25. void() W_Precache =
  26. {
  27.         precache_model ("progs/laser.mdl");     //for tracer
  28.         precache_sound ("weapons/r_exp3.wav");  // new rocket explosion
  29.     precache_sound ("weapons/rocket1i.wav");        // spike gun
  30.     precache_sound ("weapons/sgun1.wav");
  31.     precache_sound ("weapons/guncock.wav"); // player shotgun
  32.     precache_sound ("weapons/ric1.wav");    // ricochet (used in c code)
  33.     precache_sound ("weapons/ric2.wav");    // ricochet (used in c code)
  34.     precache_sound ("weapons/ric3.wav");    // ricochet (used in c code)
  35.     precache_sound ("weapons/spike2.wav");  // super spikes
  36.     precache_sound ("weapons/tink1.wav");   // spikes tink (used in c code)
  37.     precache_sound ("weapons/grenade.wav"); // grenade launcher
  38.     precache_sound ("weapons/bounce.wav");          // grenade bounce
  39.     precache_sound ("weapons/shotgn2.wav"); // super shotgun
  40. };
  41.  
  42. float() crandom =
  43. {
  44.     return 2*(random() - 0.5);
  45. };
  46.  
  47. /*
  48. ================
  49. W_FireAxe
  50. ================
  51. */
  52. void() W_FireAxe =
  53. {
  54.     local   vector  source;
  55.     local   vector  org;
  56.  
  57.     source = self.origin + '0 0 16';
  58.     traceline (source, source + v_forward*64, FALSE, self);
  59.     if (trace_fraction == 1.0)
  60.         return;
  61.     
  62.     org = trace_endpos - v_forward*4;
  63.  
  64.     if (trace_ent.takedamage)
  65.     {
  66.         trace_ent.axhitme = 1;
  67.         SpawnBlood (org, '0 0 0', 20);
  68.         T_Damage (trace_ent, self, self, 20);
  69.     }
  70.     else
  71.     {       // hit wall
  72.         sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
  73.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  74.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  75.         WriteCoord (MSG_BROADCAST, org_x);
  76.         WriteCoord (MSG_BROADCAST, org_y);
  77.         WriteCoord (MSG_BROADCAST, org_z);
  78.     }
  79. };
  80.  
  81.  
  82. //============================================================================
  83.  
  84.  
  85. vector() wall_velocity =
  86. {
  87.     local vector    vel;
  88.     
  89.     vel = normalize (self.velocity);
  90.     vel = normalize(vel + v_up*(random()- 0.5) + v_right*(random()- 0.5));
  91.     vel = vel + 2*trace_plane_normal;
  92.     vel = vel * 200;
  93.     
  94.     return vel;
  95. };
  96.  
  97.  
  98. /*
  99. ================
  100. SpawnMeatSpray
  101. ================
  102. */
  103. void(vector org, vector vel) SpawnMeatSpray =
  104. {
  105.     local   entity missile, mpuff;
  106.     local   vector  org;
  107.  
  108.     missile = spawn ();
  109.     missile.owner = self;
  110.     missile.movetype = MOVETYPE_BOUNCE;
  111.     missile.solid = SOLID_NOT;
  112.  
  113.     makevectors (self.angles);
  114.  
  115.     missile.velocity = vel;
  116.     missile.velocity_z = missile.velocity_z + 250 + 50*random();
  117.  
  118.     missile.avelocity = '3000 1000 2000';
  119.     
  120. // set missile duration
  121.     missile.nextthink = time + 1;
  122.     missile.think = SUB_Remove;
  123.  
  124.     setmodel (missile, "progs/zom_gib.mdl");
  125.     setsize (missile, '0 0 0', '0 0 0');            
  126.     setorigin (missile, org);
  127. };
  128.  
  129. /*
  130. ================
  131. SpawnBlood
  132. ================
  133. */
  134. void(vector org, vector vel, float damage) SpawnBlood =
  135. {
  136.     particle (org, vel*0.1, 73, damage*2);
  137. };
  138.  
  139. /*
  140. ================
  141. spawn_touchblood
  142. ================
  143. */
  144. void(float damage) spawn_touchblood =
  145. {
  146.     local vector    vel;
  147.  
  148.     vel = wall_velocity () * 0.2;
  149.     SpawnBlood (self.origin + vel*0.01, vel, damage);
  150. };
  151.  
  152.  
  153. /*
  154. ================
  155. SpawnChunk
  156. ================
  157. */
  158. void(vector org, vector vel) SpawnChunk =
  159. {
  160.     particle (org, vel*0.02, 0, 10);
  161. };
  162.  
  163. /*
  164. ==============================================================================
  165.  
  166. MULTI-DAMAGE
  167.  
  168. Collects multiple small damages into a single damage
  169.  
  170. ==============================================================================
  171. */
  172.  
  173. entity  multi_ent;
  174. float   multi_damage;
  175.  
  176. void() ClearMultiDamage =
  177. {
  178.     multi_ent = world;
  179.     multi_damage = 0;
  180. };
  181.  
  182. void() ApplyMultiDamage =
  183. {
  184.     if (!multi_ent)
  185.         return;
  186.     T_Damage (multi_ent, self, self, multi_damage);
  187. };
  188.  
  189. void(entity hit, float damage) AddMultiDamage =
  190. {
  191.     if (!hit)
  192.         return;
  193.     
  194.     if (hit != multi_ent)
  195.     {
  196.         ApplyMultiDamage ();
  197.         multi_damage = damage;
  198.         multi_ent = hit;
  199.     }
  200.     else
  201.         multi_damage = multi_damage + damage;
  202. };
  203.  
  204. /*
  205. ==============================================================================
  206.  
  207. BULLETS
  208.  
  209. ==============================================================================
  210. */
  211.  
  212. /*
  213. ================
  214. TraceAttack
  215. ================
  216. */
  217. void(float damage, vector dir) TraceAttack =
  218. {
  219.     local   vector  vel, org;
  220.     
  221.     vel = normalize(dir + v_up*crandom() + v_right*crandom());
  222.     vel = vel + 2*trace_plane_normal;
  223.     vel = vel * 200;
  224.  
  225.     org = trace_endpos - dir*4;
  226.  
  227.     if (trace_ent.takedamage)
  228.     {
  229.         SpawnBlood (org, vel*0.2, damage);
  230.         AddMultiDamage (trace_ent, damage);
  231.     }
  232.     else
  233.     {
  234.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  235.         WriteByte (MSG_BROADCAST, TE_GUNSHOT);
  236.         WriteCoord (MSG_BROADCAST, org_x);
  237.         WriteCoord (MSG_BROADCAST, org_y);
  238.         WriteCoord (MSG_BROADCAST, org_z);
  239.     }
  240. };
  241.  
  242. /*
  243. ================
  244. FireBullets
  245.  
  246. Used by shotgun, super shotgun, and enemy soldier firing
  247. Go to the trouble of combining multiple pellets into a single damage call.
  248. ================
  249. */
  250. void(float shotcount, vector dir, vector spread) FireBullets =
  251. {
  252.     local   vector direction;
  253.     local   vector  src;
  254.     
  255.     makevectors(self.v_angle);
  256.  
  257.     src = self.origin + v_forward*10;
  258.     src_z = self.absmin_z + self.size_z * 0.7;
  259.  
  260.     ClearMultiDamage ();
  261.     while (shotcount > 0)
  262.     {
  263.         direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up;
  264.  
  265.         traceline (src, src + direction*2048, FALSE, self);
  266.         if (trace_fraction != 1.0)
  267.             TraceAttack (4, direction);
  268.  
  269.         shotcount = shotcount - 1;
  270.     }
  271.     ApplyMultiDamage ();
  272. };
  273.  
  274. /*
  275. ================
  276. W_FireShotgun
  277. ================
  278. */
  279. void() W_FireShotgun =
  280. {
  281.     local vector dir;
  282.  
  283.     sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM); 
  284.  
  285.     self.punchangle_x = -2;
  286.     
  287.     self.currentammo = self.ammo_shells = self.ammo_shells - 1;
  288.     dir = aim (self, 100000);
  289.     FireBullets (6, dir, '0.04 0.04 0');
  290. };
  291.  
  292.  
  293.  
  294. /*
  295. ================
  296. W_FireSuperShotgun
  297. ================
  298. */
  299. void() W_FireSuperShotgun =
  300. {
  301.     local vector dir;
  302.  
  303.     if (self.currentammo == 1)
  304.     {
  305.         W_FireShotgun ();
  306.         return;
  307.     }
  308.         
  309.     sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM); 
  310.  
  311.     self.punchangle_x = -4;
  312.     
  313.     self.currentammo = self.ammo_shells = self.ammo_shells - 2;
  314.     dir = aim (self, 100000);
  315.     FireBullets (14, dir, '0.14 0.08 0');
  316. };
  317.  
  318.  
  319. /*
  320. ==============================================================================
  321.  
  322. ROCKETS
  323.  
  324. ==============================================================================
  325. */
  326.  
  327. void()  s_explode1      =       [0,             s_explode2] {};
  328. void()  s_explode2      =       [1,             s_explode3] {};
  329. void()  s_explode3      =       [2,             s_explode4] {};
  330. void()  s_explode4      =       [3,             s_explode5] {};
  331. void()  s_explode5      =       [4,             s_explode6] {};
  332. void()  s_explode6      =       [5,             SUB_Remove] {};
  333.  
  334. void() BecomeExplosion =
  335. {
  336.     self.movetype = MOVETYPE_NONE;
  337.     self.velocity = '0 0 0';
  338.     self.touch = SUB_Null;
  339.     setmodel (self, "progs/s_explod.spr");
  340.     self.solid = SOLID_NOT;
  341.     s_explode1 ();
  342. };
  343.  
  344. void() T_MissileTouch =
  345. {
  346.     local float     damg;
  347.  
  348.     if (other == self.owner)
  349.         return;         // don't explode on owner
  350.  
  351.     if (pointcontents(self.origin) == CONTENT_SKY)
  352.     {
  353.         remove(self);
  354.         return;
  355.     }
  356.  
  357.     damg = 100 + random()*20;
  358.     
  359.     if (other.health)
  360.     {
  361.         if (other.classname == "monster_shambler")
  362.             damg = damg * 0.5;      // mostly immune
  363.         T_Damage (other, self, self.owner, damg );
  364.     }
  365.  
  366.     // don't do rad